import fs from 'fs'
import path from 'path'
import { DATA_DIR } from '../config/env.js'

/**
 * 学习主题数据存储管理模块
 * 负责学习主题的CRUD操作和数据持久化
 */

// 确保数据目录存在，如果不存在则创建
if (!fs.existsSync(DATA_DIR)) {
  fs.mkdirSync(DATA_DIR, { recursive: true })
}

// 学习主题数据文件路径
const SUBJECTS_FILE = path.join(DATA_DIR, 'subjects.json')

/**
 * 默认学习主题数据结构
 * 包含预设的小学、初中、高中、大学等不同学段的学习主题
 * 每个主题包含：基本信息、适用年级、难度等级、前置知识、学习时长、具体知识点等
 */
const DEFAULT_SUBJECTS = {
  subjects: [
    {
      id: 'number-line',                    // 主题唯一标识
      name: '数轴与数字',                    // 主题名称
      description: '理解正负数、数轴上的位置关系', // 主题描述
      icon: '📏',                          // 主题图标
      level: 'primary',                     // 学段：primary(小学), junior(初中), senior(高中), university(大学)
      grade: [1, 2, 3, 4, 5, 6],          // 适用年级数组
      difficulty: 'easy',                   // 难度等级：easy(简单), medium(中等), hard(困难)
      prerequisites: [],                    // 前置知识主题ID数组
      estimatedTime: 30,                    // 预计学习时间（分钟）
      topics: [                             // 具体知识点列表
        {
          id: 'positive-negative',          // 知识点ID
          name: '正负数概念',                // 知识点名称
          description: '理解正数和负数的含义', // 知识点描述
          order: 1                          // 学习顺序
        },
        {
          id: 'number-line-position',       // 知识点ID
          name: '数轴上的位置',              // 知识点名称
          description: '在数轴上表示数字',   // 知识点描述
          order: 2                          // 学习顺序
        },
        {
          id: 'number-comparison',          // 知识点ID
          name: '数字比较',                  // 知识点名称
          description: '比较正负数的大小',   // 知识点描述
          order: 3                          // 学习顺序
        }
      ],
      createdAt: new Date().toISOString(),  // 创建时间
      updatedAt: new Date().toISOString()   // 更新时间
    },
    {
      id: 'fraction',
      name: '分数概念',
      description: '分数的可视化表示和运算',
      icon: '🍕',
      level: 'primary',
      grade: [3, 4, 5, 6],
      difficulty: 'medium',
      prerequisites: ['number-line'],
      estimatedTime: 45,
      topics: [
        {
          id: 'fraction-basics',
          name: '分数基础',
          description: '分子、分母的概念',
          order: 1
        },
        {
          id: 'fraction-visualization',
          name: '分数可视化',
          description: '用图形表示分数',
          order: 2
        },
        {
          id: 'fraction-comparison',
          name: '分数比较',
          description: '比较分数大小',
          order: 3
        }
      ],
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString()
    },
    {
      id: 'geometry',
      name: '几何图形',
      description: '面积、周长、体积的计算',
      icon: '📐',
      level: 'primary',
      grade: [4, 5, 6],
      difficulty: 'medium',
      prerequisites: ['number-line'],
      estimatedTime: 60,
      topics: [
        {
          id: 'basic-shapes',
          name: '基本图形',
          description: '认识基本几何图形',
          order: 1
        },
        {
          id: 'perimeter',
          name: '周长计算',
          description: '计算图形的周长',
          order: 2
        },
        {
          id: 'area',
          name: '面积计算',
          description: '计算图形的面积',
          order: 3
        }
      ],
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString()
    },
    {
      id: 'function',
      name: '函数图像',
      description: '函数图像的绘制和分析',
      icon: '📈',
      level: 'senior',
      grade: [10, 11, 12],
      difficulty: 'hard',
      prerequisites: ['number-line', 'fraction'],
      estimatedTime: 90,
      topics: [
        {
          id: 'function-concept',
          name: '函数概念',
          description: '理解函数的基本概念',
          order: 1
        },
        {
          id: 'linear-function',
          name: '一次函数',
          description: '一次函数的图像和性质',
          order: 2
        },
        {
          id: 'quadratic-function',
          name: '二次函数',
          description: '二次函数的图像和性质',
          order: 3
        }
      ],
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString()
    }
  ],
  /**
   * 学段配置信息
   * 定义不同教育阶段的年级范围和学习特点
   */
  levels: [
    {
      id: 'primary',                        // 学段ID
      name: '小学',                          // 学段名称
      description: '小学阶段数学学习',        // 学段描述
      grades: [1, 2, 3, 4, 5, 6]           // 包含的年级
    },
    {
      id: 'junior',                         // 学段ID
      name: '初中',                          // 学段名称
      description: '初中阶段数学学习',        // 学段描述
      grades: [7, 8, 9]                     // 包含的年级
    },
    {
      id: 'senior',                         // 学段ID
      name: '高中',                          // 学段名称
      description: '高中阶段数学学习',        // 学段描述
      grades: [10, 11, 12]                  // 包含的年级
    },
    {
      id: 'university',                     // 学段ID
      name: '大学',                          // 学段名称
      description: '大学阶段数学学习',        // 学段描述
      grades: [13, 14, 15, 16]             // 包含的年级
    }
  ],
  /**
   * 难度等级配置
   * 定义不同难度等级的特点和适用人群
   */
  difficulties: [
    {
      id: 'easy',                           // 难度ID
      name: '简单',                          // 难度名称
      description: '基础概念，适合初学者'     // 难度描述
    },
    {
      id: 'medium',                         // 难度ID
      name: '中等',                          // 难度名称
      description: '需要一定基础，适合进阶学习' // 难度描述
    },
    {
      id: 'hard',                           // 难度ID
      name: '困难',                          // 难度名称
      description: '复杂概念，需要扎实基础'   // 难度描述
    }
  ]
}

/**
 * 加载学习主题数据
 * 从JSON文件中读取学习主题数据，如果文件不存在则创建默认数据
 * @returns {Object} 包含subjects、levels、difficulties的完整数据结构
 */
export function loadSubjects() {
  try {
    // 检查数据文件是否存在
    if (fs.existsSync(SUBJECTS_FILE)) {
      // 读取并解析JSON数据
      const data = JSON.parse(fs.readFileSync(SUBJECTS_FILE, 'utf8'))
      return data
    }
  } catch (e) {
    console.error('读取学习主题数据失败:', e)
  }

  // 如果文件不存在或读取失败，创建默认数据并保存
  saveSubjects(DEFAULT_SUBJECTS)
  return DEFAULT_SUBJECTS
}

/**
 * 保存学习主题数据到JSON文件
 * @param {Object} data - 要保存的完整数据结构
 * @returns {boolean} 保存成功返回true，失败返回false
 */
export function saveSubjects(data) {
  try {
    // 将数据转换为格式化的JSON字符串并写入文件
    fs.writeFileSync(SUBJECTS_FILE, JSON.stringify(data, null, 2))
    return true
  } catch (e) {
    console.error('保存学习主题数据失败:', e)
    return false
  }
}

/**
 * 获取所有学习主题
 * @returns {Array} 所有学习主题的数组
 */
export function getAllSubjects() {
  const data = loadSubjects()
  return data.subjects
}

/**
 * 根据学段获取学习主题
 * @param {string} level - 学段ID (primary/junior/senior/university)
 * @returns {Array} 指定学段的学习主题数组
 */
export function getSubjectsByLevel(level) {
  const data = loadSubjects()
  return data.subjects.filter(subject => subject.level === level)
}

/**
 * 根据年级获取学习主题
 * @param {number} grade - 年级数字 (1-16)
 * @returns {Array} 适用于指定年级的学习主题数组
 */
export function getSubjectsByGrade(grade) {
  const data = loadSubjects()
  return data.subjects.filter(subject => subject.grade.includes(grade))
}

/**
 * 根据难度获取学习主题
 * @param {string} difficulty - 难度等级 (easy/medium/hard)
 * @returns {Array} 指定难度的学习主题数组
 */
export function getSubjectsByDifficulty(difficulty) {
  const data = loadSubjects()
  return data.subjects.filter(subject => subject.difficulty === difficulty)
}

/**
 * 根据ID获取单个学习主题
 * @param {string} subjectId - 学习主题的ID
 * @returns {Object|null} 找到的学习主题对象，未找到返回null
 */
export function getSubjectById(subjectId) {
  const data = loadSubjects()
  return data.subjects.find(subject => subject.id === subjectId)
}

/**
 * 添加新的学习主题
 * @param {Object} subjectData - 新学习主题的数据
 * @param {string} [subjectData.id] - 主题ID，如果不提供则自动生成
 * @param {string} subjectData.name - 主题名称
 * @param {string} subjectData.description - 主题描述
 * @param {string} subjectData.level - 学段ID
 * @returns {Object|null} 新创建的学习主题对象，创建失败返回null
 */
export function addSubject(subjectData) {
  const data = loadSubjects()
  // 创建新主题对象，自动生成ID和时间戳
  const newSubject = {
    ...subjectData,
    id: subjectData.id || `subject-${Date.now()}`,
    createdAt: new Date().toISOString(),
    updatedAt: new Date().toISOString()
  }

  // 添加到主题列表并保存
  data.subjects.push(newSubject)
  if (saveSubjects(data)) {
    return newSubject
  }
  return null
}

/**
 * 更新学习主题
 * @param {string} subjectId - 要更新的学习主题ID
 * @param {Object} updateData - 要更新的数据字段
 * @returns {Object|null} 更新后的学习主题对象，更新失败返回null
 */
export function updateSubject(subjectId, updateData) {
  const data = loadSubjects()
  // 查找要更新的主题索引
  const subjectIndex = data.subjects.findIndex(subject => subject.id === subjectId)

  if (subjectIndex === -1) {
    return null
  }

  // 更新主题数据，保留原有字段，更新指定字段，更新时间戳
  data.subjects[subjectIndex] = {
    ...data.subjects[subjectIndex],
    ...updateData,
    updatedAt: new Date().toISOString()
  }

  // 保存更新后的数据
  if (saveSubjects(data)) {
    return data.subjects[subjectIndex]
  }
  return null
}

/**
 * 删除学习主题
 * @param {string} subjectId - 要删除的学习主题ID
 * @returns {boolean} 删除成功返回true，失败返回false
 */
export function deleteSubject(subjectId) {
  const data = loadSubjects()
  // 查找要删除的主题索引
  const subjectIndex = data.subjects.findIndex(subject => subject.id === subjectId)

  if (subjectIndex === -1) {
    return false
  }

  // 从数组中移除主题并保存
  data.subjects.splice(subjectIndex, 1)
  return saveSubjects(data)
}

/**
 * 获取所有学段信息
 * @returns {Array} 包含所有学段信息的数组
 */
export function getAllLevels() {
  const data = loadSubjects()
  return data.levels
}

/**
 * 获取所有难度等级信息
 * @returns {Array} 包含所有难度等级信息的数组
 */
export function getAllDifficulties() {
  const data = loadSubjects()
  return data.difficulties
}
